template<class SegNode>
struct SegTree {
	const int n;
	vector<SegNode> tr;

	SegTree(int _n) : n(_n), tr(n * 4 + 1) {}
	SegTree(vector<SegNode> &init) : SegTree((int)init.size() - 1) {
		auto build = [&](auto &&self, int p, int l, int r) -> void {
			if (l == r) {
				tr[p] = init[l];
				return;
			}
			int m = (l + r) >> 1;
			self(self, p << 1, l, m);
			self(self, p << 1 | 1, m + 1, r);
			pull(p);
		};
		build(build, 1, 1, n);
	}

	inline void pull(int p) {
		tr[p] = tr[p << 1] + tr[p << 1 | 1];
	}

	inline void modify(int p, int l, int r, int pos, SegNode& v) {
		if (l == r) {
			tr[p] = tr[p] + v;
			return;
		}
		int m = (l + r) >> 1;
		if (pos <= m) {
			modify(p << 1, l, m, pos, v);
		} else {
			modify(p << 1 | 1, m + 1, r, pos, v);
		}
		pull(p);
	}

	inline void modify(int pos, SegNode& v) {
		modify(1, 1, n, pos, v);
	}

	inline SegNode query(int p, int l, int r, int ql, int qr) {
		if (l >= ql && r <= qr) {
			return tr[p];
		}
		int m = (l + r) >> 1;
		if (ql <= m && qr > m) {
			return query(p << 1, l, m, ql, qr) + query(p << 1 | 1, m + 1, r, ql, qr);
		} else if (ql <= m) {
			return query(p << 1, l, m, ql, qr);
		} else {
			return query(p << 1 | 1, m + 1, r, ql, qr);
		}
	}

	inline SegNode query(int l, int r) {
		return query(1, 1, n, l, r);
	}
};

struct SegNode {
	ll sum;
};

SegNode operator+(SegNode lhs, SegNode rhs) {
	SegNode t;
	t.sum = lhs.sum + rhs.sum;
	return t;
};
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	int n, m;
	cin >> n >> m;

	vector<SegNode> a(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> a[i].sum;
	}
	SegTree<SegNode> tr(a);

	while (m--) {
		int op, l, r, k;
		cin >> op;
		if (op == 1) {
			cin >> l >> k;
			SegNode t = {k};
			tr.modify(l, t);
		} else {
			cin >> l >> r;
			cout << tr.query(l, r).sum << '\n';
		}
	}
	return 0;
}